﻿using GDM.Hogar.Entidades;
using GDM.Hogar.Repositorios.Contratos;
using GDM.Hogar.Repositorios.Core;
using GDM.Hogar.Repositorios.Soporte;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace GDM.Hogar.Repositorios
{
    public class RemitoRepositorio : Repositorio, IRemitoRepositorio
    {
        public RemitoRepositorio(IDbManager dbManager)
            : base(dbManager)
        {
        }

        protected override string ProcInsertar
        {
            get { return ProcedimientosAlmacenados.Remito.Insertar; }
        }

        protected override string ProcActualizar
        {
            get { return ProcedimientosAlmacenados.Remito.Actualizar; }
        }

        public void ActivarRemito(int remitoId, bool activo)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@RemitoId", DbType.Int64, ParameterDirection.Input, remitoId));
            parametros.Add(CrearParametro("@Activo", DbType.Boolean, ParameterDirection.Input, activo));
            EjecutarConsulta(ProcedimientosAlmacenados.Remito.Activar, parametros);
        }

        public Remito CrearRemito(Remito remito)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@NumeroRemito", DbType.String, ParameterDirection.Input, remito.NumeroRemito));
            parametros.Add(CrearParametro("@ProveedorId", DbType.Int64, ParameterDirection.Input, remito.ProveedorId));
            parametros.Add(CrearParametro("@FechaEntrega", DbType.DateTime, ParameterDirection.Input, remito.FechaEntrega));
            parametros.Add(CrearParametro("@Observacion", DbType.String, ParameterDirection.Input, remito.Observacion));
            return Insertar<Remito>(parametros);
        }

        public void ActualizarRemito(Remito remito)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@RemitoId", DbType.Int64, ParameterDirection.Input, remito.RemitoId));
            parametros.Add(CrearParametro("@NumeroRemito", DbType.String, ParameterDirection.Input, remito.NumeroRemito));
            parametros.Add(CrearParametro("@ProveedorId", DbType.Int64, ParameterDirection.Input, remito.ProveedorId));
            parametros.Add(CrearParametro("@FechaEntrega", DbType.DateTime, ParameterDirection.Input, remito.FechaEntrega));
            parametros.Add(CrearParametro("@Observacion", DbType.String, ParameterDirection.Input, remito.Observacion));
            Actualizar(parametros);
        }

        public Remito ObtenerRemito(string nroRemito)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@NumeroRemito", DbType.String, ParameterDirection.Input, nroRemito));
            return Obtener<Remito>(ProcedimientosAlmacenados.Remito.ObtenerPorNumero, parametros).FirstOrDefault();
        }

        public Remito ObtenerRemito(int remitoId)
        {
            IList<Parametro> parametros = new List<Parametro>();
            parametros.Add(CrearParametro("@RemitoId", DbType.Int64, ParameterDirection.Input, remitoId));
            return Obtener<Remito>(ProcedimientosAlmacenados.Remito.Obtener, parametros).FirstOrDefault();
        }

        public IList<ConsultaRemito> ObtenerRemitos()
        {
            IList<Parametro> parametros = new List<Parametro>();
            return Obtener<ConsultaRemito>(ProcedimientosAlmacenados.Remito.ObtenerTodos, parametros);
        }
    }
}